#include <iostream>
#include <any>
#include <vector>
#include <string>
#include <typeinfo>
#include <map>

// 自定义类型
class Person {
private:
    std::string m_name_;
    int m_age_;
    
public:
    Person(const std::string& name, int age) : m_name_(name), m_age_(age) {}
    
    void print() const {
        std::cout << "  Person{name=\"" << m_name_ << "\", age=" << m_age_ << "}";
    }
    
    const std::string& name() const { return m_name_; }
    int age() const { return m_age_; }
};

// 帮助函数，安全转换并打印any内容
void print_any(const std::any& any_value) {
    if (!any_value.has_value()) {
        std::cout << "  [empty]";
        return;
    }
    
    try {
        if (any_value.type() == typeid(int)) {
            std::cout << "  int: " << std::any_cast<int>(any_value);
        } else if (any_value.type() == typeid(double)) {
            std::cout << "  double: " << std::any_cast<double>(any_value);
        } else if (any_value.type() == typeid(std::string)) {
            std::cout << "  string: \"" << std::any_cast<std::string>(any_value) << "\"";
        } else if (any_value.type() == typeid(Person)) {
            std::cout << "  ";
            std::any_cast<const Person&>(any_value).print();
        } else {
            std::cout << "  [未知类型: " << any_value.type().name() << "]";
        }
    } catch (const std::bad_any_cast& e) {
        std::cout << "  [类型转换错误: " << e.what() << "]";
    }
}

void demonstrate_any() {
    std::cout << "  std::any演示:\n\n";
    
    // 1. 基本用法
    std::cout << "  基本用法:\n";
    std::any a1;  // 空的any
    std::any a2 = 42;  // 整数
    std::any a3 = 3.14;  // 浮点数
    std::any a4 = std::string("Hello, any!");  // 字符串
    
    std::cout << "  a1是否有值: " << std::boolalpha << a1.has_value() << '\n';
    std::cout << "  a2的类型: " << a2.type().name() << '\n';
    
    // 2. 访问值
    std::cout << "\n  访问any值:\n";
    try {
        std::cout << "  a2的整数值: " << std::any_cast<int>(a2) << '\n';
        std::cout << "  a3的浮点值: " << std::any_cast<double>(a3) << '\n';
        std::cout << "  a4的字符串值: " << std::any_cast<std::string>(a4) << '\n';
        
        // 错误的类型转换
        std::cout << "  尝试将a2转换为字符串: ";
        std::cout << std::any_cast<std::string>(a2) << '\n';
    } catch (const std::bad_any_cast& e) {
        std::cout << "转换失败: " << e.what() << '\n';
    }
    
    // 3. 使用指针安全地访问
    std::cout << "\n  使用any_cast<T*>安全访问:\n";
    if (auto ptr = std::any_cast<int>(&a2)) {
        std::cout << "  a2是整数: " << *ptr << '\n';
    }
    
    if (auto ptr = std::any_cast<double>(&a2)) {
        std::cout << "  a2是浮点数: " << *ptr << '\n';
    } else {
        std::cout << "  a2不是浮点数\n";
    }
    
    // 4. 修改any的值
    std::cout << "\n  修改any值:\n";
    std::cout << "  a1初始值: ";
    print_any(a1);
    std::cout << '\n';
    
    a1 = 100;
    std::cout << "  赋值为整数后: ";
    print_any(a1);
    std::cout << '\n';
    
    a1 = std::string("新字符串");
    std::cout << "  赋值为字符串后: ";
    print_any(a1);
    std::cout << '\n';
    
    // 5. 存储自定义类型
    std::cout << "\n  存储自定义类型:\n";
    std::any custom = Person("张三", 30);
    
    std::cout << "  custom的类型: " << custom.type().name() << '\n';
    std::cout << "  custom的值: ";
    print_any(custom);
    std::cout << '\n';
    
    // 6. 在容器中使用
    std::cout << "\n  在容器中使用any:\n";
    std::vector<std::any> values = {
        42,
        3.14,
        std::string("any向量"),
        Person("李四", 25)
    };
    
    std::cout << "  容器内容:\n";
    for (const auto& val : values) {
        std::cout << "    ";
        print_any(val);
        std::cout << '\n';
    }
    
    // 7. 在映射中存储不同类型的值
    std::cout << "\n  在映射中存储不同类型的值:\n";
    std::map<std::string, std::any> config = {
        {"version", 1},
        {"pi", 3.14159},
        {"name", std::string("配置名称")},
        {"debug", true},
        {"author", Person("王五", 35)}
    };
    
    std::cout << "  配置项:\n";
    for (const auto& [key, value] : config) {
        std::cout << "    " << key << " = ";
        print_any(value);
        std::cout << '\n';
    }
    
    // 8. 清空any
    std::cout << "\n  清空any:\n";
    std::cout << "  a2重置前: ";
    print_any(a2);
    std::cout << '\n';
    
    a2.reset();
    std::cout << "  a2重置后: ";
    print_any(a2);
    std::cout << '\n';
} 